// 方法装饰器
// 方法装饰器，可以装饰方法

// (target:Object,propertyKey,descriptor)=>void | proopertyDescriptor
// 1.日志记录 AOP

/*
 * @param target 装饰的目标对象，如果是静态成员，则是类的构造函数，如果是实例成员则是类的原型对象
 * @param propertyKey 装饰的成员名称
 * @param descriptor 成员的属性描述
 */
function log(target, propertyKey, descriptor) {
  // 获取老的函数
  const originalMethod = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log("日志" + propertyKey + args);
    const result = originalMethod.apply(this, args);
    console.log("result:" + result);
    return result;
  };
}
class Calculator {
  @log
  add(a: number, b: number): number {
    return a + b;
  }
}
const intance = new Calculator();
intance.add(1,2);